package com.chentongwei.spring.annotation.bean.config;

import com.chentongwei.spring.annotation.bean.entity.Car;
import com.chentongwei.spring.annotation.bean.entity.Dog;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * @Description: bean的生命周期
 *  bean创建--》初始化--》销毁的过程
 *
 *  构造对象（对象创建）
 *      单实例：在容器启动的时候创建对象
 *      多实例：在每次获取的时候创建对象
 *  初始化
 *      对象创建完成，并赋值好，调用初始化方法
 *  销毁
 *      单实例：容器管理的时候进行销毁
 *      多实例：容器不会管理这个bean；所以说容器不会调用销毁方法。需要纯手动去调用
 *
 *
 *  目前是Spring容器管理bean的生命周期。
 *
 *  我们可以自定义初始化和销毁方法，容器在进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
 *  1）、指定初始化和销毁方法
 *  2）、通过让Bean实现InitialzingBean接口来实现自定义初始化方法，实现DisposableBean接口来自定义销毁方法
 *  3）、我们可以使用JSR250规范里的两个注解。
 *      注解@PostConstruct：在bean创建完成并且属性赋值完成，来执行初始化方法（被注解标记的方法）
 *      注解@PreDestroy：在容器销毁bean之前，通知我们进行清理工作。
 */
@Configuration
@ComponentScan(basePackages = "com.chentongwei.spring.annotation.bean.entity")
@Import(Dog.class)
public class MainConfig {

    @Bean(initMethod = "init", destroyMethod = "destory")
    public Car car() {
        return new Car();
    }
}
